package jinzhi;
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}


//二进制链表转整数  TODO：记住这个方法  位移的作用
public class basic1290 {

        public int getDecimalValue(ListNode head) {
            int  value=0;
            ListNode cur=head;
            while (cur!=null){
                value<<=1;
                value+= cur.val;
                cur=cur.next;
            }
            return  value;
       }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(0);
        ListNode listNode3 = new ListNode(0);
        ListNode listNode4 = new ListNode(1);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=null;

        basic1290 basic1290 = new basic1290();
        int decimalValue = basic1290.getDecimalValue(listNode1);
        System.out.println(decimalValue);
    }
}

//    a  shl b就表示把a转为二进制后左移b位（在后面添b个0）。例如100的二进制为1100100，而110010000转成十进制是400，那么100 shl 2 = 400。可以看出，a shl b的值实际上就是a乘以2的b次方，因为在二进制数后添一个0就相当于该数乘以2。
//
//        那么我们这道题已经是二进制的形式了，就可以直接使用了
//
//        下面我们以101来作为例子分析
//        第一轮:
//        ans=0
//        ans<<=1之后的结果为ans=0(1*2的0次幂)
//        我们取出来的节点是1
//        ans += cur.val之后的结果为ans=0+1=1
//        cur = cur.next之后的结果为0
//
//        二进制变化的演示:
//
//        ans一开始是0
//        左移1之后变为:00
//        加上cur.val之后变为:00+1=01
//
//        第二轮:
//        ans=1
//        ans<<=1之后的结果为ans=2(1*2的1次幂)
//        我们取出来的节点是0
//        ans += cur.val之后的结果为ans=2+0=2
//        cur = cur.next之后的结果为1
//
//        二进制变化的演示:
//
//        ans为:01
//        左移之后变为:010
//        加上cur.val之后变为:010+0=010
//
//        第三轮:
//        ans=2
//        ans<<=1之后的结果为ans=4(2*2的1次幂)
//        我们取出来的节点是1
//        ans += cur.val之后的结果为ans=4+1=2
//        cur = cur.next之后的结果为null
//
//        二进制变化的演示:
//
//        ans为:010
//        左移之后变为:0100
//        加上cur.val之后变为:0100+1=0101

